package com.lijian.controller.admin;

import com.lijian.pojo.Type;
import com.lijian.service.TypeService;
import org.hibernate.validator.constraints.NotBlank;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import sun.rmi.runtime.Log;

import javax.validation.Valid;

@Controller
@RequestMapping("/admin")
public class TypeController {

    @Autowired
    private TypeService typeService;

    @GetMapping("/types")               //默认size为10，根据id，倒叙排序
    public String typeList(@PageableDefault(size = 5, sort = {"id"}, direction = Sort.Direction.DESC)
                                   Pageable pageable, Model model) {

        Page<Type> types = typeService.listType(pageable);
        model.addAttribute("page", types);
        return "admin/types";
    }

    @GetMapping("/types/input")
    public String input() {
        return "admin/types-input";
    }

    @GetMapping("/types/{id}/input")
    public String editInput(@PathVariable Long id, Model model){
        Type typeById = typeService.findTypeById(id);
        model.addAttribute("type", typeById);
        return "admin/types-input";
    }

    @PostMapping("/types")   //@Valid是配合@NotBlank校验是否为空 BindingResult一定要和要校验的参数挨着，不然没效果
    public String addType(@Valid Type type, BindingResult result, RedirectAttributes attributes) {
        //后端校验
        /*String name = type.getName();
        Type dbType = typeService.findTypeByName(name);
        if (dbType != null) {
            result.rejectValue("name", "nameError", "不能重复添加分类");
        }
        if(result.hasErrors()){
            return "admin/types-input";
        }*/

        Type typeResult = typeService.addType(type);
        if (typeResult == null) {
            attributes.addFlashAttribute("message", "新增失败");
        } else {
            attributes.addFlashAttribute("message", "新增成功");
        }
        return "redirect:/admin/types";
    }

    @PostMapping("/types/{id}")   //@Valid是配合@NotBlank校验是否为空
    public String editType(Type type, @PathVariable Long id, RedirectAttributes attributes) {

        Type typeResult = typeService.updateType(id, type);

        if (typeResult == null) {
            attributes.addFlashAttribute("message", "更新失败");
        } else {
            attributes.addFlashAttribute("message", "更新成功");
        }
        return "redirect:/admin/types";
    }
    @GetMapping("/types/{id}/delete")
    public String delete(@PathVariable Long id, RedirectAttributes attributes){
        typeService.deleteType(id);
        attributes.addFlashAttribute("message", "删除成功");
        return "redirect:/admin/types";
    }
}
